﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Collections;
using System.Data.SqlClient;
using SistemaGO_Library.Persistencia.BD;

namespace SistemaGO_Library.Entidades.Proposta
{
    class RepositorioProposta : IRepositorioProposta
    {
        private BD bd = new BD();
        
        //Descrição: Método que é usado nas regras de negócio do sistema identificando se uma proposta que o mesmo está querendo inserir ou procurar já existe no banco para evitar o cadastro em duplicidade.
        //Valores: cod = atributo identificador da proposta que vai dizer se existe ou não.
        public bool existeProposta(int cod) {
            string sql = "SELECT proposta_cod FROM tb_proposta WHERE proposta_cod = " + cod + " ";
            using (SqlConnection conexao = new SqlConnection("Data Source=(local);Initial Catalog=SistemaGO;Integrated Security=True")) {
                conexao.Open();
                SqlCommand comando = new SqlCommand(sql, conexao);
                SqlDataReader dr = comando.ExecuteReader();
                int contador = 0;
                while (dr.Read()) {
                    string exite = dr["proposta_cod"].ToString();
                    contador = contador + 1;
                }

                if (contador > 0) {
                    return true;
                } else {
                    return false;
                }
            }
        }

        //Descrição: Método que realiza inserção de uma proposta no banco de dados.
        //Valores: pro = proposta passada para que seja realizada a inserção caso ele esteja conforme com todas as regras de negócio.
        public void inserirProposta(Proposta pro) {
            StringBuilder sql = new StringBuilder();
            sql.Append("INSERT INTO tb_proposta (proposta_cod, terc_cod, pedido_cod, proposta_data_envio, proposta_observacao, proposta_valor, proposta_prazo) ");
            sql.Append("VALUES (" + pro.Proposta_cod + ", " + pro.Terc_cod + ", " + pro.Pedido_cod + ", '" + pro.Proposta_data_envio.ToString("MM/dd/yyyy") + "', '" + pro.Proposta_observacao + "', " + pro.Proposta_valor + ", '" + pro.Proposta_prazo + "')");
            bd.rodarComando(sql.ToString());
        }

        //Descrição: Método que realiza busca de uma proposta no banco de dados.
        //Valores: cod = codigo passado para que seja realizada a busca.
        public Proposta buscarProposta(int cod) {
            Proposta pro = new Proposta();
            string sql = "SELECT * FROM tb_proposta WHERE proposta_cod = " + cod + " ";

            using (SqlConnection conexao = new SqlConnection("Data Source=(local);Initial Catalog=SistemaGO;Integrated Security=True")) {
                conexao.Open();
                SqlCommand comando = new SqlCommand(sql, conexao);
                SqlDataReader dr = comando.ExecuteReader();
                while (dr.Read()) {
                    pro.Pedido_cod = int.Parse(dr["proposta_cod"].ToString());
                    pro.Terc_cod = int.Parse(dr["terc_cod"].ToString());
                    pro.Pedido_cod = int.Parse(dr["pedido_cod"].ToString());
                    pro.Proposta_data_envio = DateTime.Parse(dr["proposta_data_envio"].ToString());
                    pro.Proposta_observacao = dr["proposta_observacao"].ToString();
                    pro.Proposta_valor = double.Parse(dr["proposta_valor"].ToString());
                    pro.Proposta_prazo = dr["proposta_prazo"].ToString();
                }
                return pro;
            }
        }

        //Descrição: Método que realiza alteração de uma proposta no banco de dados.
        //Valores: cod = codigo passado para que seja realizada a busca de qual proposta ele irá alterar, novaProposta = nova proposta que será inserida no lugar da antiga.
        public void alterarProposta(int cod, Proposta novaProposta) {
            string sql;
            sql = "UPDATE tb_proposta SET terc_cod = " + novaProposta.Terc_cod + ", pedido_cod = " + novaProposta.Pedido_cod + ", proposta_data_envio = '" + novaProposta.Proposta_data_envio.ToString("MM/dd/yyyy") + "', proposta_observacao = '" + novaProposta.Proposta_observacao + "', proposta_valor = " + novaProposta.Proposta_valor + ", proposta_prazo = '" + novaProposta.Proposta_prazo + "'  WHERE proposta_cod = " + cod + " ";
            bd.rodarComando(sql);
        }

        //Descrição: Método que realiza exclusão de uma proposta no banco de dados.
        //Valores: cod = codigo passado para que seja realizada a busca no banco para exclusão.
        public void excluirProposta(int cod) {
            string sql;
            sql = "DELETE FROM tb_proposta WHERE proposta_cod = " + cod + " ";
            bd.rodarComando(sql);
        }

        //Descrição: metodo para retornar todas as propostas do pedido informado que estão com o status de 'nova'
        //Valores: pedido_cod = codigo do pedido
        //Retorno: Arraylist contendo todas as propostas do pedido
        public ArrayList propostasDoPedido(int pedido_codigo) {
            string sql = "SELECT pedido_cod, terc_cod, proposta_cod, proposta_data_envio, proposta_observacao, proposta_valor, proposta_prazo, proposta_situacao FROM tb_proposta WHERE pedido_cod = " + pedido_codigo + " AND proposta_situacao = 'N'";
            ArrayList propostas = new ArrayList();
            Proposta pro;

            using (SqlConnection conexao = new SqlConnection("Data Source=(local);Initial Catalog=SistemaGO;Integrated Security=True"))
            {
                conexao.Open();
                SqlCommand comando = new SqlCommand(sql, conexao);
                SqlDataReader dr = comando.ExecuteReader();
                while (dr.Read())
                {
                    pro = new Proposta();
                    pro.Proposta_cod = int.Parse(dr["proposta_cod"].ToString());
                    pro.Terc_cod = int.Parse(dr["terc_cod"].ToString());
                    pro.Pedido_cod = int.Parse(dr["pedido_cod"].ToString());
                    pro.Proposta_data_envio = DateTime.Parse(dr["proposta_data_envio"].ToString());
                    pro.Proposta_observacao = dr["proposta_observacao"].ToString();
                    pro.Proposta_valor = double.Parse(dr["proposta_valor"].ToString());
                    pro.Proposta_prazo = dr["proposta_prazo"].ToString();
                    pro.Proposta_situacao = dr["proposta_situacao"].ToString();

                    propostas.Add(pro);
                }
            }
            return propostas;
        }

        public void mudarSituacao(string newSituacao, int cod)
        {
            string sql = "UPDATE tb_proposta SET proposta_situacao = '" + newSituacao + "' WHERE proposta_cod = " + cod + " ";
            bd.rodarComando(sql);
        }

        public void aceitarProposta(int codigo_proposta, int codigo_pedido) {
            this.mudarSituacao("A", codigo_proposta);

            string sql = "UPDATE tb_proposta SET proposta_situacao = 'R' WHERE pedido_cod = "+codigo_pedido+" AND proposta_situacao <> 'A'";
            bd.rodarComando(sql);
        }
    }
}